Java中元素的大小比較
? ? equals-Object 類:默認比較兩個對象地址是否相等
? ? Comparable接口: return > 0 標志當前對象 > 0
Return = 0 表示當前對象= 0
Return < 0 表示當前對象< 0
? ? Comparator:接口(更靈活):對原來Student類無影響 可以實現無數種比較———策略模式
return =0 ?o1 =o2
Return > 0 o1 >o2;
Return < 0 o1 <o2
Java.lang.Comparable:一個類實現了這個接口,就說明該類具備了可比較的能力
Public int compareTo(Object o):當前對象和傳入對象o比較(死板)
Java.lang.Comparator:比較器。Student類無需事先此接口,專門的比較Student的類大小關系實現此皆苦,這種類稱為比較器
Public int compare(Object o1,Object o2):比較o1和o2的大小
AgeSec
AgeDesc
優先級隊列&TopK
? ? PriorityQueue優先級隊列(基于堆):滿足隊列的三大操作:
入隊offer:調用堆的add方法
出隊poll:按照優先級出隊,最高先出調用堆的extractMax()
查看隊首元素peek:查看堆頂元素
操作系統的作業調度(JDK的PriorityQueue基于最小堆實現,需要調整為最大堆(原o1-o2改為o2-o1)2)
? ? TopK問題:取大構建小堆 取小構建大堆
時間復雜度 O(nlogk)
? ? ? ?空間復雜度 O(k)
兩種解決思路:1.排序法Nlogn 2.優先級隊列 nlogk 3.最優解 :快排partition思想O(n)
Map和BST
二叉樹:理論基礎
二分搜索樹——TreeMap(紅黑樹,二分搜索樹)
哈希表——HashSet,HashMap
? ? Map和Set:
set存儲不重復的線性表——若只是判斷元素是否存在,或者過濾重復元素,使用Set集合
Map:存儲的數據是一種映射關系:需要根據不重復的key對應value,需要使用Map集合
**,Map和Set是一種專門用來進行搜索的容器或者數據結構,其搜索德效率 與具體的實例化子類有關。****
盡量不要使用Map和Set集合進行遍歷,對于這倆集合的遍歷操作是效率比較低的操作。使用Set和Map集合的核心操作在于搜索
? ? Map集合的常用操作:
? ? Map集合內部的元素之間的先后順序與插入順序關系不大(put(key,value)
? ? 根據Key 取得value: get(key) getOrDefault(key,dafaultValue)
? ? Map集合中刪除元素 :remove(key)
? ? Map集合的遍歷:(不到萬不得已,不要使用):collection 接口及其子類可以很方便的使用for_each循環進行遍歷,但是Map和Collection幾個沒有任何關系:keySet(); values();entrySet()【Set<map.Entry<K,V>> entrySet()】
? ? Map集合的搜索 contains方法在Map中是非常高效的
(HashMap中接近O(1))TreeMap中接近O(logN)
? ? Set集合的使用,等同于List,都是Collection的子接口 最常用Set集合的場景,(元素去重)
***Map 存映射 Set存不重復元素,用于去重***
? ? 二分搜索樹(BST)
? ? 核心操作在于查找 3 {1.是個二叉樹;2,。所有節點值滿足:根節點 }左子樹的所有節點,根節點<右子樹的所有節點,此處不考慮等于的情況(JDK中的BST沒有重復元素3;存儲的元素必須具備可比較性,Comparable或者傳入Comparator)
? ? 規律:{1,;中序遍歷得到的結果就是一個升序集合 2.源于最小最大值 最小值:第一個node.left==null 最大值:第一個node.right == null;3.在BST中插入一個新元素,這個元素一定是葉子結點位置插入!})